package tests;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import fallingGame.Brick;

public class GameModelTest {

	private static fallingGame.GameModel m;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		m = new fallingGame.GameModel();
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		m = null;
	}

	@Test
	public final void testPhysics() {
		m.getHero().setY_vel(1);
		m.getHero().setX_vel(1);
		m.physics();
		// test first condition
		assertEquals(416, m.getHero().getY(), 0);
		assertEquals(0, m.getHero().getY_vel(), 0);
		assertEquals(false, m.getHero().isJumping());

		m.getHero().setX(587);
		m.getHero().setX_vel(1);
		m.physics();
		// test second condition
		assertEquals(586, m.getHero().getX(), 0);
		assertEquals(0, m.getHero().getX_vel(), 0);

		m.getHero().setX(185);
		m.getHero().setX_vel(1);
		m.physics();
		// test third condition
		assertEquals(187, m.getHero().getX(), 0);
		assertEquals(0, m.getHero().getX_vel(), 0);
	}

	@Test
	public final void testCheckBricks() {
		// check first condition
		m = new fallingGame.GameModel();
		for (Brick b : m.getBricks()) {
			b.setY(465);
		}
		m.checkBricks();
		for (Brick b : m.getBricks()) {
			assertEquals(-b.getHeight(), b.getY(), 0);
		}

		// check second condition
		m = new fallingGame.GameModel();
		m.getBricks().get(0).setY(416);
		m.getBricks().get(0).setX(400);
		m.checkBricks();
		assertEquals(true, m.isGameOver());

	}

	@Test
	public final void testCheckStar() {
		// check first condition
		m = new fallingGame.GameModel();
		m.getStar().setX(300);
		m.getStar().setY(457);
		m.getStar().setY_vel(1);
		m.checkStar();
		assertEquals(456, m.getStar().getY(), 0);
		assertEquals(-1, m.getStar().getY_vel(), 0);

		// check second condition
		m = new fallingGame.GameModel();
		m.getStar().setY(456);
		m.getStar().setY_vel(1);
		m.getStar().setX(400);
		m.checkStar();
		assertEquals(-m.getStar().getHeight(), m.getStar().getY(), 0);
		assertEquals(1, m.getStar().getY_vel(), 0);

		// check third condition
		m = new fallingGame.GameModel();
		m.getStar().setX(100);
		m.getStar().setY(100);
		m.getStar().setY_vel(1);
		m.checkStar();
		assertEquals(-m.getStar().getHeight(), m.getStar().getY(), 0);
		assertEquals(1, m.getStar().getY_vel(), 0);
	}

}
